﻿#ifndef MODULE_INTERFACE_H
#define MODULE_INTERFACE_H

#include <QObject>
#include <QString>

// 确保编译器支持纯虚函数语法
#ifdef _MSC_VER
#pragma warning(disable: 4251) // 禁用 dll-interface 警告
#endif

// 前向声明
class QWidget;
class ModbusManager;

// 统一的模块接口
class IModule : public QObject
{
    Q_OBJECT
public:
    explicit IModule(QObject *parent = nullptr) : QObject(parent) {}
    virtual ~IModule() = default;

    // 初始化模块
    virtual void init() = 0;
    
    // 文件操作
    virtual bool saveToFile(const QString& filePath) = 0;
    virtual bool openFromFile(const QString& filePath) = 0;
    virtual void reset() = 0;
    
    // 修改状态
    virtual bool isModified() const = 0;
    virtual void setModified(bool modified) = 0;
    
    // 获取文件过滤器
    virtual QString getFileFilter() const = 0;
    
    // 获取模块名称
    virtual QString getModuleName() const = 0;

    // 仿真相关方法
    virtual void startSimulation(const QString& serialPort, int baudRate, int dataBits, int stopBits, int parity) = 0;
    virtual void stopSimulation() = 0;
    virtual bool isSimulationRunning() const = 0;
    
    // 设置Modbus管理器
    virtual void setModbusManager(ModbusManager* modbusManager) = 0;
    
    // 处理Modbus数据更新的虚函数
    virtual void onCoilUpdated(int address, bool value) = 0;
    virtual void onRegisterUpdated(int address, quint16 value) = 0;

Q_SIGNALS:
    void logMessageGenerated(const QString& message);
    // 添加写线圈请求信号，用于安全地请求Modbus操作
    void writeCoilRequested(int address, bool value);
    void writeRegiseterRequested(int address, quint16 value);
    void signalRegisterChanged(int oldAddr, int newAddr);
    void signalAddressChanged(int oldAddr, int newAddr);
};

// 模块工厂接口
class IModuleFactory
{
public:
    virtual ~IModuleFactory() = default;
    virtual IModule* createModule(QWidget* ui, ModbusManager* modbusManager, QObject* parent = nullptr) = 0;
    virtual QString getModuleName() const = 0;
};

// 导出函数类型定义
typedef IModule* (*CreateModuleFunc)(QWidget* ui, ModbusManager* modbusManager, QObject* parent);
typedef IModuleFactory* (*CreateFactoryFunc)();

// 导出函数名称
#define CREATE_MODULE_FUNC_NAME "createModule"
#define CREATE_FACTORY_FUNC_NAME "createFactory"
#define GET_MODULE_NAME_FUNC_NAME "getModuleName"

// 清理编译器特定的警告
#ifdef _MSC_VER
#pragma warning(default: 4251)
#endif

#endif // MODULE_INTERFACE_H
